
import Dep from './dep'
import { isObject } from './utils';

// 用来定义了一个响应式的数据
export default function reactive(data) {
  if (isObject(data)) {
    Object.keys(data).forEach((key) => {
      defineReactive(data, key);
    });
  }

  return data;
}

function defineReactive(data, key) {
  let value = data[key];
  const dep = new Dep();
  Object.defineProperty(data, key, {
    // 取值时，依赖保存
    get() {
      dep.depend();
      return value;
    },

    // 赋值时，通知所有依赖更新
    set(newVal) {
      value = newVal;
      dep.notify();
    },
  });

  // 层层嵌套都要添加响应式
  if (isObject(value)) {
    reactive(value);
  }
}
